This is R Notebook present a process analysis of 746 completed, fully
validated, and archived projects in the HOT Tasking Manager (HOT-TM).
Process discovery was performed using bupaR, a suite of open-source R
packages for business process data analysis.
# Import required libraries
suppressWarnings({
library(bupaverse)
library(reshape2)
library(gt)
library(scales)
library(readr)
library(dplyr)
library(magrittr)
library(ggplot2)
library(Hmisc)
library(stringr)
})
Read event data The files containing project info (projects.csv) and
project states(eventlog.csv) are read.
event_log_df <- read.csv("splits_invalidations.csv", stringsAsFactors = FALSE, sep = ",")
projects <- read.csv("projects.csv", stringsAsFactors = FALSE, sep = ",")
event_log_df[c('projectId', 'task')] <- str_split_fixed(event_log_df$taskId, '_', 2)
projects$projectId <- as.character(projects$projectId)
event_log_df = merge(x = event_log_df, y = projects[,c("projectId","difficulty","priority")], by = "projectId")
event_log_df <- event_log_df %>%
convert_timestamps(columns = c("start", "complete"), format = ymd_hms) %>%
activitylog(case_id = "taskId", activity_id = "action", resource_id = "actionBy", timestamps = c("start", "complete"))
event_log_df <- event_log_df %>% mutate(action_duration = difftime(as.POSIXct(`complete`), as.POSIXct(`start`), units = "mins"))
Project states
head(event_log_df)
# Log of 12 events consisting of:
2 traces
5 cases
6 instances of 2 activities
1 resource
Events occurred from 2021-12-01 04:45:26 until 2021-12-01 04:54:13
# Variables were mapped as follows:
Case identifier: taskId
Activity identifier: action
Resource identifier: actionBy
Timestamps: start, complete
Project info
head(projects)
Summary of the eventlog
summary(event_log_df)
Number of events: 3702910
Number of cases: 312289
Number of traces: 19084
Number of distinct activities: 10
Average trace length: 11.85732
Start eventlog: NA
End eventlog: NA
projectId taskId action actionBy start complete username
Length:1853074 Length:1853074 Length:1853074 Length:1853074 Min. :2021-12-01 04:45:26.33 Min. :2021-12-01 04:46:29.93 Length:1853074
Class :character Class :character Class :character Class :character 1st Qu.:2022-06-24 17:40:18.63 1st Qu.:2022-06-24 13:23:49.07 Class :character
Mode :character Mode :character Mode :character Mode :character Median :2022-11-10 14:41:44.95 Median :2022-11-10 10:05:05.82 Mode :character
Mean :2022-11-18 20:48:41.79 Mean :2022-11-18 16:25:08.50
3rd Qu.:2023-03-23 15:15:46.61 3rd Qu.:2023-03-23 15:42:18.42
Max. :2023-11-30 14:31:20.80 Max. :2023-11-30 14:31:20.81
NA's :3238
mappingLevel task difficulty priority .order action_duration
Length:1853074 Length:1853074 Length:1853074 Length:1853074 Min. : 1 Length:1853074
Class :character Class :character Class :character Class :character 1st Qu.: 463269 Class :difftime
Mode :character Mode :character Mode :character Mode :character Median : 926538 Mode :numeric
Mean : 926538
3rd Qu.:1389806
Max. :1853074
Absolute frequency of states in the eventlog.
event_log_df %>% activity_frequency("activity")
Activity presence shows in what percentage of cases an activity is
present.
event_log_df %>% activity_presence()
tmp <- event_log_df %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration))
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration))
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0))
mean(mappingvalidation$morevalidation)*100
[1] 57.51616
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
event_log_df %>% trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "mins"))
event_log_df[event_log_df$difficulty == "EASY",] %>% activity_presence()
tmp <- event_log_df[event_log_df$difficulty == "EASY",] %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration))
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration))
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0))
mean(mappingvalidation$morevalidation)*100
[1] 59.63736
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
tmp %>% trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "mins"))
event_log_df[event_log_df$difficulty == "MODERATE",] %>% activity_presence()
tmp <- event_log_df[event_log_df$difficulty == "MODERATE",] %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration))
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration))
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0))
mean(mappingvalidation$morevalidation)*100
[1] 51.37316
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
tmp %>% trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "mins"))
event_log_df[event_log_df$difficulty == "CHALLENGING",] %>% activity_presence()
tmp <- event_log_df[event_log_df$difficulty == "CHALLENGING",] %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration))
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration))
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0))
mean(mappingvalidation$morevalidation)*100
[1] 21.10187
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
tmp %>% trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "mins"))
event_log_df[event_log_df$priority == "LOW",] %>% activity_presence()
tmp <- event_log_df[event_log_df$priority == "LOW",] %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration))
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration))
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0))
mean(mappingvalidation$morevalidation)*100
[1] 61.36931
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
tmp %>% trace_explorer(n_traces =10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "mins"))
event_log_df[event_log_df$priority == "MEDIUM",] %>% activity_presence()
tmp <- event_log_df[event_log_df$priority == "MEDIUM",] %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration))
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration))
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0))
mean(mappingvalidation$morevalidation)*100
[1] 57.85076
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
tmp %>% trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "mins"))
event_log_df[event_log_df$priority == "HIGH",] %>% activity_presence()
tmp <- event_log_df[event_log_df$priority == "HIGH",] %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration))
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration))
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0))
mean(mappingvalidation$morevalidation)*100
[1] 50.39496
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
tmp %>% trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "mins"))
event_log_df[event_log_df$priority == "URGENT",] %>% activity_presence()
tmp <- event_log_df[event_log_df$priority == "URGENT",] %>% filter_trace_frequency(percentage = 0.85)
totalmapping <- tmp[tmp$action == "LOCKED_FOR_MAPPING",] %>% group_by(taskId) %>% summarise(mapping_duration = sum(action_duration))
totalmapping
totalvalidation <- tmp[tmp$action == "LOCKED_FOR_VALIDATION",] %>% group_by(taskId) %>% summarise(validation_duration = sum(action_duration))
totalvalidation
mappingvalidation = merge(totalmapping, totalvalidation, by='taskId', all=TRUE)
mappingvalidation[is.na(mappingvalidation)] = 0
mappingvalidation
mappingvalidation <- transform(mappingvalidation, morevalidation= ifelse(mapping_duration < validation_duration, 1, 0))
mean(mappingvalidation$morevalidation)*100
[1] 27.51878
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
tmp %>% trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "days"))
tmp1 <- tmp
tmp1 %>% process_map(performance(median, "mins"))
In the frequency process map, nodes represent the absolute number of
activity instance executions and edges represent the absolute number of
times source and target activities were executed directly following each
other. To provide a clear process map, the event log was previously
filter using filter_trace_frequency(). Setting percentage = 0.85 selects
at least 85% of the cases, starting with those that have the highest
frequency.
tmp <- event_log_df %>% filter_trace_frequency(percentage = 0.85)
tmp %>% process_map(frequency("absolute"))
trace_explorer() with coverage argument n_traces = 10 shows the 10
most frequent in the event log.
event_log_df %>% trace_explorer(n_traces = 10, show_labels = FALSE, coverage_labels = c("relative"))

In the temporal process map, the value of nodes and edges represent
the median duration in days of activities and waiting times.
Organisation
Composition of the total number of contributors of the analysed
projects according to their mapping level.
Breakdown of status execution frequency per mapping level.
LS0tDQp0aXRsZTogIlByb2Nlc3NfQW5hbHlzaXMiDQpvdXRwdXQ6DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQotLS0NClRoaXMgaXMgUiBOb3RlYm9vayBwcmVzZW50IGEgcHJvY2VzcyBhbmFseXNpcyBvZiA3NDYgY29tcGxldGVkLCBmdWxseSB2YWxpZGF0ZWQsIGFuZCBhcmNoaXZlZCBwcm9qZWN0cyBpbiB0aGUgSE9UIFRhc2tpbmcgTWFuYWdlciAoSE9ULVRNKS4gUHJvY2VzcyBkaXNjb3Zlcnkgd2FzIHBlcmZvcm1lZCB1c2luZyBidXBhUiwgYSBzdWl0ZSBvZiBvcGVuLXNvdXJjZSBSIHBhY2thZ2VzIGZvciBidXNpbmVzcyBwcm9jZXNzIGRhdGEgYW5hbHlzaXMuDQpgYGB7cn0NCiMgSW1wb3J0IHJlcXVpcmVkIGxpYnJhcmllcw0Kc3VwcHJlc3NXYXJuaW5ncyh7DQpsaWJyYXJ5KGJ1cGF2ZXJzZSkNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGd0KQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KEhtaXNjKQ0KbGlicmFyeShzdHJpbmdyKQ0KfSkNCmBgYA0KDQpSZWFkIGV2ZW50IGRhdGENClRoZSBmaWxlcyBjb250YWluaW5nIHByb2plY3QgaW5mbyAocHJvamVjdHMuY3N2KSBhbmQgcHJvamVjdCBzdGF0ZXMoZXZlbnRsb2cuY3N2KSBhcmUgcmVhZC4NCmBgYHtyfQ0KZXZlbnRfbG9nX2RmIDwtIHJlYWQuY3N2KCJzcGxpdHNfaW52YWxpZGF0aW9ucy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIHNlcCA9ICIsIikNCnByb2plY3RzIDwtIHJlYWQuY3N2KCJwcm9qZWN0cy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UsIHNlcCA9ICIsIikNCmV2ZW50X2xvZ19kZltjKCdwcm9qZWN0SWQnLCAndGFzaycpXSA8LSBzdHJfc3BsaXRfZml4ZWQoZXZlbnRfbG9nX2RmJHRhc2tJZCwgJ18nLCAyKQ0KcHJvamVjdHMkcHJvamVjdElkIDwtIGFzLmNoYXJhY3Rlcihwcm9qZWN0cyRwcm9qZWN0SWQpDQpldmVudF9sb2dfZGYgPSBtZXJnZSh4ID0gZXZlbnRfbG9nX2RmLCB5ID0gcHJvamVjdHNbLGMoInByb2plY3RJZCIsImRpZmZpY3VsdHkiLCJwcmlvcml0eSIpXSwgYnkgPSAicHJvamVjdElkIikNCmV2ZW50X2xvZ19kZiA8LSBldmVudF9sb2dfZGYgJT4lDQogIGNvbnZlcnRfdGltZXN0YW1wcyhjb2x1bW5zID0gYygic3RhcnQiLCAiY29tcGxldGUiKSwgZm9ybWF0ID0geW1kX2htcykgJT4lDQogIGFjdGl2aXR5bG9nKGNhc2VfaWQgPSAidGFza0lkIiwgYWN0aXZpdHlfaWQgPSAiYWN0aW9uIiwgcmVzb3VyY2VfaWQgPSAiYWN0aW9uQnkiLCB0aW1lc3RhbXBzID0gYygic3RhcnQiLCAiY29tcGxldGUiKSkNCmV2ZW50X2xvZ19kZiA8LSBldmVudF9sb2dfZGYgJT4lICBtdXRhdGUoYWN0aW9uX2R1cmF0aW9uID0gZGlmZnRpbWUoYXMuUE9TSVhjdChgY29tcGxldGVgKSwgYXMuUE9TSVhjdChgc3RhcnRgKSwgdW5pdHMgPSAibWlucyIpKQ0KYGBgDQoNClByb2plY3Qgc3RhdGVzDQpgYGB7cn0NCmhlYWQoZXZlbnRfbG9nX2RmKQ0KYGBgDQpQcm9qZWN0IGluZm8NCmBgYHtyfQ0KaGVhZChwcm9qZWN0cykNCmBgYA0KU3VtbWFyeSBvZiB0aGUgZXZlbnRsb2cgDQpgYGB7cn0NCnN1bW1hcnkoZXZlbnRfbG9nX2RmKQ0KYGBgDQoNCkFic29sdXRlIGZyZXF1ZW5jeSBvZiBzdGF0ZXMgaW4gdGhlIGV2ZW50bG9nLg0KYGBge3J9DQpldmVudF9sb2dfZGYgJT4lIGFjdGl2aXR5X2ZyZXF1ZW5jeSgiYWN0aXZpdHkiKQ0KYGBgDQoNCg0KQWN0aXZpdHkgcHJlc2VuY2Ugc2hvd3MgaW4gd2hhdCBwZXJjZW50YWdlIG9mIGNhc2VzIGFuIGFjdGl2aXR5IGlzIHByZXNlbnQuDQpgYGB7cn0NCmV2ZW50X2xvZ19kZiAlPiUgYWN0aXZpdHlfcHJlc2VuY2UoKQ0KYGBgDQpgYGB7cn0NCnRtcCA8LSBldmVudF9sb2dfZGYgICU+JSBmaWx0ZXJfdHJhY2VfZnJlcXVlbmN5KHBlcmNlbnRhZ2UgPSAwLjg1KQ0KYGBgDQoNCmBgYHtyfQ0KdG90YWxtYXBwaW5nIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX01BUFBJTkciLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZShtYXBwaW5nX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWxtYXBwaW5nDQpgYGANCg0KDQoNCmBgYHtyfQ0KdG90YWx2YWxpZGF0aW9uIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX1ZBTElEQVRJT04iLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZSh2YWxpZGF0aW9uX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWx2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA9IG1lcmdlKHRvdGFsbWFwcGluZywgdG90YWx2YWxpZGF0aW9uLCBieT0ndGFza0lkJywgYWxsPVRSVUUpDQptYXBwaW5ndmFsaWRhdGlvbltpcy5uYShtYXBwaW5ndmFsaWRhdGlvbildID0gMA0KbWFwcGluZ3ZhbGlkYXRpb24NCmBgYA0KDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPC0gdHJhbnNmb3JtKG1hcHBpbmd2YWxpZGF0aW9uLCBtb3JldmFsaWRhdGlvbj0gaWZlbHNlKG1hcHBpbmdfZHVyYXRpb24gPCB2YWxpZGF0aW9uX2R1cmF0aW9uLCAxLCAwKSkgDQptZWFuKG1hcHBpbmd2YWxpZGF0aW9uJG1vcmV2YWxpZGF0aW9uKSoxMDANCmBgYA0KDQpgYGB7cn0NCnRtcCAlPiUgIHByb2Nlc3NfbWFwKGZyZXF1ZW5jeSgiYWJzb2x1dGUiKSkNCmBgYA0KDQp0cmFjZV9leHBsb3JlcigpIHdpdGggY292ZXJhZ2UgYXJndW1lbnQgbl90cmFjZXMgPSAxMCBzaG93cyB0aGUgMTAgbW9zdCBmcmVxdWVudCBpbiB0aGUgZXZlbnQgbG9nLg0KYGBge3J9DQpldmVudF9sb2dfZGYgJT4lICAgIHRyYWNlX2V4cGxvcmVyKG5fdHJhY2VzID0gMTAsIHNob3dfbGFiZWxzID0gRkFMU0UsIGNvdmVyYWdlX2xhYmVscyA9IGMoInJlbGF0aXZlIikpDQpgYGANCg0KSW4gdGhlIHRlbXBvcmFsIHByb2Nlc3MgbWFwLCB0aGUgdmFsdWUgb2Ygbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgbWVkaWFuIGR1cmF0aW9uIGluIGRheXMgb2YgYWN0aXZpdGllcyBhbmQgd2FpdGluZyB0aW1lcy4NCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJkYXlzIikpDQpgYGANCg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgIm1pbnMiKSkNCmBgYCANCg0KYGBge3J9DQpldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIkVBU1kiLF0gJT4lIGFjdGl2aXR5X3ByZXNlbmNlKCkNCmBgYA0KDQpgYGB7cn0NCnRtcCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIkVBU1kiLF0gICU+JSBmaWx0ZXJfdHJhY2VfZnJlcXVlbmN5KHBlcmNlbnRhZ2UgPSAwLjg1KQ0KYGBgDQoNCmBgYHtyfQ0KdG90YWxtYXBwaW5nIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX01BUFBJTkciLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZShtYXBwaW5nX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWxtYXBwaW5nDQpgYGANCg0KYGBge3J9DQp0b3RhbHZhbGlkYXRpb24gPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfVkFMSURBVElPTiIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKHZhbGlkYXRpb25fZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbHZhbGlkYXRpb24NCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmd2YWxpZGF0aW9uID0gbWVyZ2UodG90YWxtYXBwaW5nLCB0b3RhbHZhbGlkYXRpb24sIGJ5PSd0YXNrSWQnLCBhbGw9VFJVRSkNCm1hcHBpbmd2YWxpZGF0aW9uW2lzLm5hKG1hcHBpbmd2YWxpZGF0aW9uKV0gPSAwDQptYXBwaW5ndmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPC0gdHJhbnNmb3JtKG1hcHBpbmd2YWxpZGF0aW9uLCBtb3JldmFsaWRhdGlvbj0gaWZlbHNlKG1hcHBpbmdfZHVyYXRpb24gPCB2YWxpZGF0aW9uX2R1cmF0aW9uLCAxLCAwKSkgDQptZWFuKG1hcHBpbmd2YWxpZGF0aW9uJG1vcmV2YWxpZGF0aW9uKSoxMDANCmBgYA0KDQpgYGB7cn0NCnRtcCAlPiUgIHByb2Nlc3NfbWFwKGZyZXF1ZW5jeSgiYWJzb2x1dGUiKSkNCmBgYA0KDQp0cmFjZV9leHBsb3JlcigpIHdpdGggY292ZXJhZ2UgYXJndW1lbnQgbl90cmFjZXMgPSAxMCBzaG93cyB0aGUgMTAgbW9zdCBmcmVxdWVudCBpbiB0aGUgZXZlbnQgbG9nLg0KYGBge3J9DQp0bXAgJT4lICAgIHRyYWNlX2V4cGxvcmVyKG5fdHJhY2VzID0gMTAsIHNob3dfbGFiZWxzID0gRkFMU0UsIGNvdmVyYWdlX2xhYmVscyA9IGMoInJlbGF0aXZlIikpDQpgYGANCg0KSW4gdGhlIHRlbXBvcmFsIHByb2Nlc3MgbWFwLCB0aGUgdmFsdWUgb2Ygbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgbWVkaWFuIGR1cmF0aW9uIGluIGRheXMgb2YgYWN0aXZpdGllcyBhbmQgd2FpdGluZyB0aW1lcy4NCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJkYXlzIikpDQpgYGANCg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgIm1pbnMiKSkNCmBgYA0KDQpgYGB7cn0NCmV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiTU9ERVJBVEUiLF0gJT4lIGFjdGl2aXR5X3ByZXNlbmNlKCkNCmBgYA0KDQpgYGB7cn0NCnRtcCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIk1PREVSQVRFIixdICAlPiUgZmlsdGVyX3RyYWNlX2ZyZXF1ZW5jeShwZXJjZW50YWdlID0gMC44NSkNCmBgYA0KDQpgYGB7cn0NCnRvdGFsbWFwcGluZyA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9NQVBQSU5HIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UobWFwcGluZ19kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsbWFwcGluZw0KYGBgDQoNCmBgYHtyfQ0KdG90YWx2YWxpZGF0aW9uIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX1ZBTElEQVRJT04iLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZSh2YWxpZGF0aW9uX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWx2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA9IG1lcmdlKHRvdGFsbWFwcGluZywgdG90YWx2YWxpZGF0aW9uLCBieT0ndGFza0lkJywgYWxsPVRSVUUpDQptYXBwaW5ndmFsaWRhdGlvbltpcy5uYShtYXBwaW5ndmFsaWRhdGlvbildID0gMA0KbWFwcGluZ3ZhbGlkYXRpb24NCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmd2YWxpZGF0aW9uIDwtIHRyYW5zZm9ybShtYXBwaW5ndmFsaWRhdGlvbiwgbW9yZXZhbGlkYXRpb249IGlmZWxzZShtYXBwaW5nX2R1cmF0aW9uIDwgdmFsaWRhdGlvbl9kdXJhdGlvbiwgMSwgMCkpIA0KbWVhbihtYXBwaW5ndmFsaWRhdGlvbiRtb3JldmFsaWRhdGlvbikqMTAwDQpgYGANCg0KYGBge3J9DQp0bXAgJT4lICBwcm9jZXNzX21hcChmcmVxdWVuY3koImFic29sdXRlIikpDQpgYGANCg0KdHJhY2VfZXhwbG9yZXIoKSB3aXRoIGNvdmVyYWdlIGFyZ3VtZW50IG5fdHJhY2VzID0gMTAgc2hvd3MgdGhlIDEwIG1vc3QgZnJlcXVlbnQgaW4gdGhlIGV2ZW50IGxvZy4NCmBgYHtyfQ0KdG1wICU+JSAgICB0cmFjZV9leHBsb3JlcihuX3RyYWNlcyA9IDEwLCBzaG93X2xhYmVscyA9IEZBTFNFLCBjb3ZlcmFnZV9sYWJlbHMgPSBjKCJyZWxhdGl2ZSIpKQ0KYGBgDQoNCkluIHRoZSB0ZW1wb3JhbCBwcm9jZXNzIG1hcCwgdGhlIHZhbHVlIG9mIG5vZGVzIGFuZCBlZGdlcyByZXByZXNlbnQgdGhlIG1lZGlhbiBkdXJhdGlvbiBpbiBkYXlzIG9mIGFjdGl2aXRpZXMgYW5kIHdhaXRpbmcgdGltZXMuDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAiZGF5cyIpKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJtaW5zIikpDQpgYGANCg0KYGBge3J9DQpldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIkNIQUxMRU5HSU5HIixdICU+JSBhY3Rpdml0eV9wcmVzZW5jZSgpDQpgYGANCg0KYGBge3J9DQp0bXAgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJDSEFMTEVOR0lORyIsXSAgJT4lIGZpbHRlcl90cmFjZV9mcmVxdWVuY3kocGVyY2VudGFnZSA9IDAuODUpDQpgYGANCg0KYGBge3J9DQp0b3RhbG1hcHBpbmcgPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfTUFQUElORyIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKG1hcHBpbmdfZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbG1hcHBpbmcNCmBgYA0KDQpgYGB7cn0NCnRvdGFsdmFsaWRhdGlvbiA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9WQUxJREFUSU9OIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UodmFsaWRhdGlvbl9kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsdmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPSBtZXJnZSh0b3RhbG1hcHBpbmcsIHRvdGFsdmFsaWRhdGlvbiwgYnk9J3Rhc2tJZCcsIGFsbD1UUlVFKQ0KbWFwcGluZ3ZhbGlkYXRpb25baXMubmEobWFwcGluZ3ZhbGlkYXRpb24pXSA9IDANCm1hcHBpbmd2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA8LSB0cmFuc2Zvcm0obWFwcGluZ3ZhbGlkYXRpb24sIG1vcmV2YWxpZGF0aW9uPSBpZmVsc2UobWFwcGluZ19kdXJhdGlvbiA8IHZhbGlkYXRpb25fZHVyYXRpb24sIDEsIDApKSANCm1lYW4obWFwcGluZ3ZhbGlkYXRpb24kbW9yZXZhbGlkYXRpb24pKjEwMA0KYGBgDQoNCmBgYHtyfQ0KdG1wICU+JSAgcHJvY2Vzc19tYXAoZnJlcXVlbmN5KCJhYnNvbHV0ZSIpKQ0KYGBgDQoNCnRyYWNlX2V4cGxvcmVyKCkgd2l0aCBjb3ZlcmFnZSBhcmd1bWVudCBuX3RyYWNlcyA9IDEwIHNob3dzIHRoZSAxMCBtb3N0IGZyZXF1ZW50IGluIHRoZSBldmVudCBsb2cuDQpgYGB7cn0NCnRtcCAlPiUgICAgdHJhY2VfZXhwbG9yZXIobl90cmFjZXMgPSAxMCwgc2hvd19sYWJlbHMgPSBGQUxTRSwgY292ZXJhZ2VfbGFiZWxzID0gYygicmVsYXRpdmUiKSkNCmBgYA0KDQpJbiB0aGUgdGVtcG9yYWwgcHJvY2VzcyBtYXAsIHRoZSB2YWx1ZSBvZiBub2RlcyBhbmQgZWRnZXMgcmVwcmVzZW50IHRoZSBtZWRpYW4gZHVyYXRpb24gaW4gZGF5cyBvZiBhY3Rpdml0aWVzIGFuZCB3YWl0aW5nIHRpbWVzLg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgImRheXMiKSkNCmBgYA0KDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAibWlucyIpKQ0KYGBgDQoNCmBgYHtyfQ0KZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiTE9XIixdICU+JSBhY3Rpdml0eV9wcmVzZW5jZSgpDQpgYGANCg0KYGBge3J9DQp0bXAgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiTE9XIixdICAlPiUgZmlsdGVyX3RyYWNlX2ZyZXF1ZW5jeShwZXJjZW50YWdlID0gMC44NSkNCmBgYA0KDQpgYGB7cn0NCnRvdGFsbWFwcGluZyA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9NQVBQSU5HIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UobWFwcGluZ19kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsbWFwcGluZw0KYGBgDQoNCmBgYHtyfQ0KdG90YWx2YWxpZGF0aW9uIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX1ZBTElEQVRJT04iLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZSh2YWxpZGF0aW9uX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWx2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA9IG1lcmdlKHRvdGFsbWFwcGluZywgdG90YWx2YWxpZGF0aW9uLCBieT0ndGFza0lkJywgYWxsPVRSVUUpDQptYXBwaW5ndmFsaWRhdGlvbltpcy5uYShtYXBwaW5ndmFsaWRhdGlvbildID0gMA0KbWFwcGluZ3ZhbGlkYXRpb24NCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmd2YWxpZGF0aW9uIDwtIHRyYW5zZm9ybShtYXBwaW5ndmFsaWRhdGlvbiwgbW9yZXZhbGlkYXRpb249IGlmZWxzZShtYXBwaW5nX2R1cmF0aW9uIDwgdmFsaWRhdGlvbl9kdXJhdGlvbiwgMSwgMCkpIA0KbWVhbihtYXBwaW5ndmFsaWRhdGlvbiRtb3JldmFsaWRhdGlvbikqMTAwDQpgYGANCg0KYGBge3J9DQp0bXAgJT4lICBwcm9jZXNzX21hcChmcmVxdWVuY3koImFic29sdXRlIikpDQpgYGANCg0KdHJhY2VfZXhwbG9yZXIoKSB3aXRoIGNvdmVyYWdlIGFyZ3VtZW50IG5fdHJhY2VzID0gMTAgc2hvd3MgdGhlIDEwIG1vc3QgZnJlcXVlbnQgaW4gdGhlIGV2ZW50IGxvZy4NCmBgYHtyfQ0KdG1wICU+JSAgICB0cmFjZV9leHBsb3JlcihuX3RyYWNlcyA9MTAsIHNob3dfbGFiZWxzID0gRkFMU0UsIGNvdmVyYWdlX2xhYmVscyA9IGMoInJlbGF0aXZlIikpDQpgYGANCg0KSW4gdGhlIHRlbXBvcmFsIHByb2Nlc3MgbWFwLCB0aGUgdmFsdWUgb2Ygbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgbWVkaWFuIGR1cmF0aW9uIGluIGRheXMgb2YgYWN0aXZpdGllcyBhbmQgd2FpdGluZyB0aW1lcy4NCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJkYXlzIikpDQpgYGANCg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgIm1pbnMiKSkNCmBgYA0KDQpgYGB7cn0NCmV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIk1FRElVTSIsXSAlPiUgYWN0aXZpdHlfcHJlc2VuY2UoKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIk1FRElVTSIsXSAgJT4lIGZpbHRlcl90cmFjZV9mcmVxdWVuY3kocGVyY2VudGFnZSA9IDAuODUpDQpgYGANCg0KYGBge3J9DQp0b3RhbG1hcHBpbmcgPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfTUFQUElORyIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKG1hcHBpbmdfZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbG1hcHBpbmcNCmBgYA0KDQpgYGB7cn0NCnRvdGFsdmFsaWRhdGlvbiA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9WQUxJREFUSU9OIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UodmFsaWRhdGlvbl9kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsdmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPSBtZXJnZSh0b3RhbG1hcHBpbmcsIHRvdGFsdmFsaWRhdGlvbiwgYnk9J3Rhc2tJZCcsIGFsbD1UUlVFKQ0KbWFwcGluZ3ZhbGlkYXRpb25baXMubmEobWFwcGluZ3ZhbGlkYXRpb24pXSA9IDANCm1hcHBpbmd2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA8LSB0cmFuc2Zvcm0obWFwcGluZ3ZhbGlkYXRpb24sIG1vcmV2YWxpZGF0aW9uPSBpZmVsc2UobWFwcGluZ19kdXJhdGlvbiA8IHZhbGlkYXRpb25fZHVyYXRpb24sIDEsIDApKSANCm1lYW4obWFwcGluZ3ZhbGlkYXRpb24kbW9yZXZhbGlkYXRpb24pKjEwMA0KYGBgDQoNCmBgYHtyfQ0KdG1wICU+JSAgcHJvY2Vzc19tYXAoZnJlcXVlbmN5KCJhYnNvbHV0ZSIpKQ0KYGBgDQoNCnRyYWNlX2V4cGxvcmVyKCkgd2l0aCBjb3ZlcmFnZSBhcmd1bWVudCBuX3RyYWNlcyA9IDEwIHNob3dzIHRoZSAxMCBtb3N0IGZyZXF1ZW50IGluIHRoZSBldmVudCBsb2cuDQpgYGB7cn0NCnRtcCAlPiUgICAgdHJhY2VfZXhwbG9yZXIobl90cmFjZXMgPSAxMCwgc2hvd19sYWJlbHMgPSBGQUxTRSwgY292ZXJhZ2VfbGFiZWxzID0gYygicmVsYXRpdmUiKSkNCmBgYA0KDQpJbiB0aGUgdGVtcG9yYWwgcHJvY2VzcyBtYXAsIHRoZSB2YWx1ZSBvZiBub2RlcyBhbmQgZWRnZXMgcmVwcmVzZW50IHRoZSBtZWRpYW4gZHVyYXRpb24gaW4gZGF5cyBvZiBhY3Rpdml0aWVzIGFuZCB3YWl0aW5nIHRpbWVzLg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgImRheXMiKSkNCmBgYA0KDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAibWlucyIpKQ0KYGBgDQoNCmBgYHtyfQ0KZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiSElHSCIsXSAlPiUgYWN0aXZpdHlfcHJlc2VuY2UoKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIkhJR0giLF0gICU+JSBmaWx0ZXJfdHJhY2VfZnJlcXVlbmN5KHBlcmNlbnRhZ2UgPSAwLjg1KQ0KYGBgDQoNCmBgYHtyfQ0KdG90YWxtYXBwaW5nIDwtIHRtcFt0bXAkYWN0aW9uID09ICJMT0NLRURfRk9SX01BUFBJTkciLF0gJT4lIGdyb3VwX2J5KHRhc2tJZCkgJT4lIHN1bW1hcmlzZShtYXBwaW5nX2R1cmF0aW9uID0gc3VtKGFjdGlvbl9kdXJhdGlvbikpIA0KdG90YWxtYXBwaW5nDQpgYGANCg0KYGBge3J9DQp0b3RhbHZhbGlkYXRpb24gPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfVkFMSURBVElPTiIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKHZhbGlkYXRpb25fZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbHZhbGlkYXRpb24NCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmd2YWxpZGF0aW9uID0gbWVyZ2UodG90YWxtYXBwaW5nLCB0b3RhbHZhbGlkYXRpb24sIGJ5PSd0YXNrSWQnLCBhbGw9VFJVRSkNCm1hcHBpbmd2YWxpZGF0aW9uW2lzLm5hKG1hcHBpbmd2YWxpZGF0aW9uKV0gPSAwDQptYXBwaW5ndmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPC0gdHJhbnNmb3JtKG1hcHBpbmd2YWxpZGF0aW9uLCBtb3JldmFsaWRhdGlvbj0gaWZlbHNlKG1hcHBpbmdfZHVyYXRpb24gPCB2YWxpZGF0aW9uX2R1cmF0aW9uLCAxLCAwKSkgDQptZWFuKG1hcHBpbmd2YWxpZGF0aW9uJG1vcmV2YWxpZGF0aW9uKSoxMDANCmBgYA0KDQpgYGB7cn0NCnRtcCAlPiUgIHByb2Nlc3NfbWFwKGZyZXF1ZW5jeSgiYWJzb2x1dGUiKSkNCmBgYA0KDQp0cmFjZV9leHBsb3JlcigpIHdpdGggY292ZXJhZ2UgYXJndW1lbnQgbl90cmFjZXMgPSAxMCBzaG93cyB0aGUgMTAgbW9zdCBmcmVxdWVudCBpbiB0aGUgZXZlbnQgbG9nLg0KYGBge3J9DQp0bXAgJT4lICAgIHRyYWNlX2V4cGxvcmVyKG5fdHJhY2VzID0gMTAsIHNob3dfbGFiZWxzID0gRkFMU0UsIGNvdmVyYWdlX2xhYmVscyA9IGMoInJlbGF0aXZlIikpDQpgYGANCg0KSW4gdGhlIHRlbXBvcmFsIHByb2Nlc3MgbWFwLCB0aGUgdmFsdWUgb2Ygbm9kZXMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgbWVkaWFuIGR1cmF0aW9uIGluIGRheXMgb2YgYWN0aXZpdGllcyBhbmQgd2FpdGluZyB0aW1lcy4NCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJkYXlzIikpDQpgYGANCg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgIm1pbnMiKSkNCmBgYA0KDQpgYGB7cn0NCmV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIlVSR0VOVCIsXSAlPiUgYWN0aXZpdHlfcHJlc2VuY2UoKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIlVSR0VOVCIsXSAgJT4lIGZpbHRlcl90cmFjZV9mcmVxdWVuY3kocGVyY2VudGFnZSA9IDAuODUpDQpgYGANCg0KYGBge3J9DQp0b3RhbG1hcHBpbmcgPC0gdG1wW3RtcCRhY3Rpb24gPT0gIkxPQ0tFRF9GT1JfTUFQUElORyIsXSAlPiUgZ3JvdXBfYnkodGFza0lkKSAlPiUgc3VtbWFyaXNlKG1hcHBpbmdfZHVyYXRpb24gPSBzdW0oYWN0aW9uX2R1cmF0aW9uKSkgDQp0b3RhbG1hcHBpbmcNCmBgYA0KDQpgYGB7cn0NCnRvdGFsdmFsaWRhdGlvbiA8LSB0bXBbdG1wJGFjdGlvbiA9PSAiTE9DS0VEX0ZPUl9WQUxJREFUSU9OIixdICU+JSBncm91cF9ieSh0YXNrSWQpICU+JSBzdW1tYXJpc2UodmFsaWRhdGlvbl9kdXJhdGlvbiA9IHN1bShhY3Rpb25fZHVyYXRpb24pKSANCnRvdGFsdmFsaWRhdGlvbg0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ3ZhbGlkYXRpb24gPSBtZXJnZSh0b3RhbG1hcHBpbmcsIHRvdGFsdmFsaWRhdGlvbiwgYnk9J3Rhc2tJZCcsIGFsbD1UUlVFKQ0KbWFwcGluZ3ZhbGlkYXRpb25baXMubmEobWFwcGluZ3ZhbGlkYXRpb24pXSA9IDANCm1hcHBpbmd2YWxpZGF0aW9uDQpgYGANCg0KYGBge3J9DQptYXBwaW5ndmFsaWRhdGlvbiA8LSB0cmFuc2Zvcm0obWFwcGluZ3ZhbGlkYXRpb24sIG1vcmV2YWxpZGF0aW9uPSBpZmVsc2UobWFwcGluZ19kdXJhdGlvbiA8IHZhbGlkYXRpb25fZHVyYXRpb24sIDEsIDApKSANCm1lYW4obWFwcGluZ3ZhbGlkYXRpb24kbW9yZXZhbGlkYXRpb24pKjEwMA0KYGBgDQoNCmBgYHtyfQ0KdG1wICU+JSAgcHJvY2Vzc19tYXAoZnJlcXVlbmN5KCJhYnNvbHV0ZSIpKQ0KYGBgDQoNCnRyYWNlX2V4cGxvcmVyKCkgd2l0aCBjb3ZlcmFnZSBhcmd1bWVudCBuX3RyYWNlcyA9IDEwIHNob3dzIHRoZSAxMCBtb3N0IGZyZXF1ZW50IGluIHRoZSBldmVudCBsb2cuDQpgYGB7cn0NCnRtcCAlPiUgICAgdHJhY2VfZXhwbG9yZXIobl90cmFjZXMgPSAxMCwgc2hvd19sYWJlbHMgPSBGQUxTRSwgY292ZXJhZ2VfbGFiZWxzID0gYygicmVsYXRpdmUiKSkNCmBgYA0KDQpJbiB0aGUgdGVtcG9yYWwgcHJvY2VzcyBtYXAsIHRoZSB2YWx1ZSBvZiBub2RlcyBhbmQgZWRnZXMgcmVwcmVzZW50IHRoZSBtZWRpYW4gZHVyYXRpb24gaW4gZGF5cyBvZiBhY3Rpdml0aWVzIGFuZCB3YWl0aW5nIHRpbWVzLg0KYGBge3J9DQp0bXAxIDwtIHRtcA0KdG1wMSAlPiUgIHByb2Nlc3NfbWFwKHBlcmZvcm1hbmNlKG1lZGlhbiwgImRheXMiKSkNCmBgYA0KDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAibWlucyIpKQ0KYGBgDQoNCkluIHRoZSBmcmVxdWVuY3kgcHJvY2VzcyBtYXAsIG5vZGVzIHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgbnVtYmVyIG9mIGFjdGl2aXR5IGluc3RhbmNlIGV4ZWN1dGlvbnMgYW5kIGVkZ2VzIHJlcHJlc2VudCB0aGUgYWJzb2x1dGUgbnVtYmVyIG9mIHRpbWVzIHNvdXJjZSBhbmQgdGFyZ2V0IGFjdGl2aXRpZXMgd2VyZSBleGVjdXRlZCBkaXJlY3RseSBmb2xsb3dpbmcgZWFjaCBvdGhlci4gVG8gcHJvdmlkZSBhIGNsZWFyIHByb2Nlc3MgbWFwLCB0aGUgZXZlbnQgbG9nIHdhcyBwcmV2aW91c2x5IGZpbHRlciB1c2luZyBmaWx0ZXJfdHJhY2VfZnJlcXVlbmN5KCkuIFNldHRpbmcgcGVyY2VudGFnZSA9IDAuODUgc2VsZWN0cyBhdCBsZWFzdCA4NSUgb2YgdGhlIGNhc2VzLCBzdGFydGluZyB3aXRoIHRob3NlIHRoYXQgaGF2ZSB0aGUgaGlnaGVzdCBmcmVxdWVuY3kuDQpgYGB7cn0NCnRtcCA8LSBldmVudF9sb2dfZGYgJT4lIGZpbHRlcl90cmFjZV9mcmVxdWVuY3kocGVyY2VudGFnZSA9IDAuODUpDQp0bXAgJT4lICBwcm9jZXNzX21hcChmcmVxdWVuY3koImFic29sdXRlIikpDQpgYGANCg0KdHJhY2VfZXhwbG9yZXIoKSB3aXRoIGNvdmVyYWdlIGFyZ3VtZW50IG5fdHJhY2VzID0gMTAgc2hvd3MgdGhlIDEwIG1vc3QgZnJlcXVlbnQgaW4gdGhlIGV2ZW50IGxvZy4NCmBgYHtyfQ0KZXZlbnRfbG9nX2RmICU+JSAgICB0cmFjZV9leHBsb3JlcihuX3RyYWNlcyA9IDEwLCBzaG93X2xhYmVscyA9IEZBTFNFLCBjb3ZlcmFnZV9sYWJlbHMgPSBjKCJyZWxhdGl2ZSIpKQ0KYGBgDQoNCkluIHRoZSB0ZW1wb3JhbCBwcm9jZXNzIG1hcCwgdGhlIHZhbHVlIG9mIG5vZGVzIGFuZCBlZGdlcyByZXByZXNlbnQgdGhlIG1lZGlhbiBkdXJhdGlvbiBpbiBkYXlzIG9mIGFjdGl2aXRpZXMgYW5kIHdhaXRpbmcgdGltZXMuDQpgYGB7cn0NCnRtcDEgPC0gdG1wDQp0bXAxICU+JSAgcHJvY2Vzc19tYXAocGVyZm9ybWFuY2UobWVkaWFuLCAiZGF5cyIpKQ0KYGBgDQoNCmBgYHtyfQ0KdG1wMSA8LSB0bXANCnRtcDEgJT4lICBwcm9jZXNzX21hcChwZXJmb3JtYW5jZShtZWRpYW4sICJtaW5zIikpDQpgYGANCg0KIyBPcmdhbmlzYXRpb24geyNvcmdhbmlzYXRpb259DQpDb21wb3NpdGlvbiBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbnRyaWJ1dG9ycyBvZiB0aGUgYW5hbHlzZWQgcHJvamVjdHMgYWNjb3JkaW5nIHRvIHRoZWlyIG1hcHBpbmcgbGV2ZWwuDQoNCmBgYHtyfQ0KbWFwcGluZ0xldmVsIDwtIGV2ZW50X2xvZ19kZiAlPiUgIGdyb3VwX2J5KG1hcHBpbmdMZXZlbCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoYWN0aW9uQnkpKQ0KbWFwcGluZ0xldmVsJHBlcmNlbnRhZ2UgPC0gcm91bmQobWFwcGluZ0xldmVsJGNvdW50L3N1bShtYXBwaW5nTGV2ZWwkY291bnQpKjEwMCwxKQ0KbWFwcGluZ0xldmVsDQpgYGANCg0KQnJlYWtkb3duIG9mIHN0YXR1cyBleGVjdXRpb24gZnJlcXVlbmN5IHBlciBtYXBwaW5nIGxldmVsLg0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QoZXZlbnRfbG9nX2RmLCBhY3Rpb24gfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInRhc2tJZCIsIGxlbmd0aCkNCmRhdGFfcGl2b3Qkc3VtIDwtICBkYXRhX3Bpdm90JEFEVkFOQ0VEICsgZGF0YV9waXZvdCRCRUdJTk5FUiArIGRhdGFfcGl2b3QkSU5URVJNRURJQVRFDQpkYXRhX3Bpdm90JEFEVkFOQ0VEcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkQURWQU5DRUQvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90JEJFR0lOTkVScGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkQkVHSU5ORVIvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90JElOVEVSTUVESUFURXBlciA8LSByb3VuZChkYXRhX3Bpdm90JElOVEVSTUVESUFURS9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3RbYygiYWN0aW9uIiwiQURWQU5DRURwZXIiLCJCRUdJTk5FUnBlciIsIklOVEVSTUVESUFURXBlciIpXSAlPiUgZ3QoKSAlPiUgIGRhdGFfY29sb3IoY29sdW1ucyA9IDI6NCwgY29sb3JzID0gY29sX251bWVyaWMocGFsZXR0ZSA9IGMoIndoaXRlIiwiZGFya2dyZWVuIiksZG9tYWluID0gYygwLDEwMCkpKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfTUFQUElORycsJ01BUFBFRCcsJ0FVVE9fVU5MT0NLRURfRk9SX01BUFBJTkcnLCdTUExJVCcsJ0JBRElNQUdFUlknKSxdLCBwcm9qZWN0SWQgfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInVzZXJuYW1lIiwgZnVuLmFnZ3JlZ2F0ZSA9IHVuaXF1ZU4pDQpzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfVkFMSURBVElPTicsJ0lOVkFMSURBVEVEJywnVkFMSURBVEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfVkFMSURBVElPTicpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiRUFTWSIsXSwgYWN0aW9uIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ0YXNrSWQiLCBsZW5ndGgpDQpkYXRhX3Bpdm90JHN1bSA8LSAgZGF0YV9waXZvdCRBRFZBTkNFRCArIGRhdGFfcGl2b3QkQkVHSU5ORVIgKyBkYXRhX3Bpdm90JElOVEVSTUVESUFURQ0KZGF0YV9waXZvdCRBRFZBTkNFRHBlciA8LSByb3VuZChkYXRhX3Bpdm90JEFEVkFOQ0VEL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRCRUdJTk5FUnBlciA8LSByb3VuZChkYXRhX3Bpdm90JEJFR0lOTkVSL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRJTlRFUk1FRElBVEVwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRJTlRFUk1FRElBVEUvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90W2MoImFjdGlvbiIsIkFEVkFOQ0VEcGVyIiwiQkVHSU5ORVJwZXIiLCJJTlRFUk1FRElBVEVwZXIiKV0gJT4lIGd0KCkgJT4lICBkYXRhX2NvbG9yKGNvbHVtbnMgPSAyOjQsIGNvbG9ycyA9IGNvbF9udW1lcmljKHBhbGV0dGUgPSBjKCJ3aGl0ZSIsImRhcmtncmVlbiIpLGRvbWFpbiA9IGMoMCwxMDApKSkNCmBgYA0KDQpgYGB7cn0NCmVhc3kgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJFQVNZIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KGVhc3lbZWFzeSRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX01BUFBJTkcnLCdNQVBQRUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9NQVBQSU5HJywnU1BMSVQnLCdCQURJTUFHRVJZJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QoZWFzeVtlYXN5JGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfVkFMSURBVElPTicsJ0lOVkFMSURBVEVEJywnVkFMSURBVEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfVkFMSURBVElPTicpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQptYXBwaW5nTGV2ZWwgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJFQVNZIixdICU+JSAgZ3JvdXBfYnkobWFwcGluZ0xldmVsKSAlPiUgc3VtbWFyaXNlKGNvdW50ID0gbl9kaXN0aW5jdChhY3Rpb25CeSkpDQptYXBwaW5nTGV2ZWwkcGVyY2VudGFnZSA8LSByb3VuZChtYXBwaW5nTGV2ZWwkY291bnQvc3VtKG1hcHBpbmdMZXZlbCRjb3VudCkqMTAwLDEpDQptYXBwaW5nTGV2ZWwNCmBgYA0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QoZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJNT0RFUkFURSIsXSwgYWN0aW9uIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ0YXNrSWQiLCBsZW5ndGgpDQpkYXRhX3Bpdm90JHN1bSA8LSAgZGF0YV9waXZvdCRBRFZBTkNFRCArIGRhdGFfcGl2b3QkQkVHSU5ORVIgKyBkYXRhX3Bpdm90JElOVEVSTUVESUFURQ0KZGF0YV9waXZvdCRBRFZBTkNFRHBlciA8LSByb3VuZChkYXRhX3Bpdm90JEFEVkFOQ0VEL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRCRUdJTk5FUnBlciA8LSByb3VuZChkYXRhX3Bpdm90JEJFR0lOTkVSL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRJTlRFUk1FRElBVEVwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRJTlRFUk1FRElBVEUvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90W2MoImFjdGlvbiIsIkFEVkFOQ0VEcGVyIiwiQkVHSU5ORVJwZXIiLCJJTlRFUk1FRElBVEVwZXIiKV0gJT4lIGd0KCkgJT4lICBkYXRhX2NvbG9yKGNvbHVtbnMgPSAyOjQsIGNvbG9ycyA9IGNvbF9udW1lcmljKHBhbGV0dGUgPSBjKCJ3aGl0ZSIsImRhcmtncmVlbiIpLGRvbWFpbiA9IGMoMCwxMDApKSkNCmBgYA0KDQpgYGB7cn0NCm1vZGVyYXRlIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiTU9ERVJBVEUiLF0NCmRhdGFfcGl2b3QgPC0gZGNhc3QobW9kZXJhdGVbbW9kZXJhdGUkYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9NQVBQSU5HJywnTUFQUEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfTUFQUElORycsJ1NQTElUJywnQkFESU1BR0VSWScpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KG1vZGVyYXRlW21vZGVyYXRlJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfVkFMSURBVElPTicsJ0lOVkFMSURBVEVEJywnVkFMSURBVEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfVkFMSURBVElPTicpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQptYXBwaW5nTGV2ZWwgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRkaWZmaWN1bHR5ID09ICJNT0RFUkFURSIsXSAlPiUgIGdyb3VwX2J5KG1hcHBpbmdMZXZlbCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoYWN0aW9uQnkpKQ0KbWFwcGluZ0xldmVsJHBlcmNlbnRhZ2UgPC0gcm91bmQobWFwcGluZ0xldmVsJGNvdW50L3N1bShtYXBwaW5nTGV2ZWwkY291bnQpKjEwMCwxKQ0KbWFwcGluZ0xldmVsDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiQ0hBTExFTkdJTkciLF0sIGFjdGlvbiB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidGFza0lkIiwgbGVuZ3RoKQ0KZGF0YV9waXZvdCRzdW0gPC0gIGRhdGFfcGl2b3QkQURWQU5DRUQgKyBkYXRhX3Bpdm90JEJFR0lOTkVSICsgZGF0YV9waXZvdCRJTlRFUk1FRElBVEUNCmRhdGFfcGl2b3QkQURWQU5DRURwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRBRFZBTkNFRC9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkQkVHSU5ORVJwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRCRUdJTk5FUi9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkSU5URVJNRURJQVRFcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdFtjKCJhY3Rpb24iLCJBRFZBTkNFRHBlciIsIkJFR0lOTkVScGVyIiwiSU5URVJNRURJQVRFcGVyIildICU+JSBndCgpICU+JSAgZGF0YV9jb2xvcihjb2x1bW5zID0gMjo0LCBjb2xvcnMgPSBjb2xfbnVtZXJpYyhwYWxldHRlID0gYygid2hpdGUiLCJkYXJrZ3JlZW4iKSxkb21haW4gPSBjKDAsMTAwKSkpDQpgYGANCg0KYGBge3J9DQpjaGFsbGVuZ2luZyA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJGRpZmZpY3VsdHkgPT0gIkNIQUxMRU5HSU5HIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KGNoYWxsZW5naW5nW2NoYWxsZW5naW5nJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfTUFQUElORycsJ01BUFBFRCcsJ0FVVE9fVU5MT0NLRURfRk9SX01BUFBJTkcnLCdTUExJVCcsJ0JBRElNQUdFUlknKSxdLCBwcm9qZWN0SWQgfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInVzZXJuYW1lIiwgZnVuLmFnZ3JlZ2F0ZSA9IHVuaXF1ZU4pDQpzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChjaGFsbGVuZ2luZ1tjaGFsbGVuZ2luZyRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX1ZBTElEQVRJT04nLCdJTlZBTElEQVRFRCcsJ1ZBTElEQVRFRCcsJ0FVVE9fVU5MT0NLRURfRk9SX1ZBTElEQVRJT04nKSxdLCBwcm9qZWN0SWQgfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInVzZXJuYW1lIiwgZnVuLmFnZ3JlZ2F0ZSA9IHVuaXF1ZU4pDQpzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ0xldmVsIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkZGlmZmljdWx0eSA9PSAiQ0hBTExFTkdJTkciLF0gJT4lICBncm91cF9ieShtYXBwaW5nTGV2ZWwpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGFjdGlvbkJ5KSkNCm1hcHBpbmdMZXZlbCRwZXJjZW50YWdlIDwtIHJvdW5kKG1hcHBpbmdMZXZlbCRjb3VudC9zdW0obWFwcGluZ0xldmVsJGNvdW50KSoxMDAsMSkNCm1hcHBpbmdMZXZlbA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJMT1ciLF0sIGFjdGlvbiB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidGFza0lkIiwgbGVuZ3RoKQ0KZGF0YV9waXZvdCRzdW0gPC0gIGRhdGFfcGl2b3QkQURWQU5DRUQgKyBkYXRhX3Bpdm90JEJFR0lOTkVSICsgZGF0YV9waXZvdCRJTlRFUk1FRElBVEUNCmRhdGFfcGl2b3QkQURWQU5DRURwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRBRFZBTkNFRC9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkQkVHSU5ORVJwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRCRUdJTk5FUi9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkSU5URVJNRURJQVRFcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdFtjKCJhY3Rpb24iLCJBRFZBTkNFRHBlciIsIkJFR0lOTkVScGVyIiwiSU5URVJNRURJQVRFcGVyIildICU+JSBndCgpICU+JSAgZGF0YV9jb2xvcihjb2x1bW5zID0gMjo0LCBjb2xvcnMgPSBjb2xfbnVtZXJpYyhwYWxldHRlID0gYygid2hpdGUiLCJkYXJrZ3JlZW4iKSxkb21haW4gPSBjKDAsMTAwKSkpDQpgYGANCg0KYGBge3J9DQpsb3cgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiTE9XIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KGxvd1tsb3ckYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9NQVBQSU5HJywnTUFQUEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfTUFQUElORycsJ1NQTElUJywnQkFESU1BR0VSWScpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KGxvd1tsb3ckYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9WQUxJREFUSU9OJywnSU5WQUxJREFURUQnLCdWQUxJREFURUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9WQUxJREFUSU9OJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmdMZXZlbCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJMT1ciLF0gJT4lICBncm91cF9ieShtYXBwaW5nTGV2ZWwpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGFjdGlvbkJ5KSkNCm1hcHBpbmdMZXZlbCRwZXJjZW50YWdlIDwtIHJvdW5kKG1hcHBpbmdMZXZlbCRjb3VudC9zdW0obWFwcGluZ0xldmVsJGNvdW50KSoxMDAsMSkNCm1hcHBpbmdMZXZlbA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJNRURJVU0iLF0sIGFjdGlvbiB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidGFza0lkIiwgbGVuZ3RoKQ0KZGF0YV9waXZvdCRzdW0gPC0gIGRhdGFfcGl2b3QkQURWQU5DRUQgKyBkYXRhX3Bpdm90JEJFR0lOTkVSICsgZGF0YV9waXZvdCRJTlRFUk1FRElBVEUNCmRhdGFfcGl2b3QkQURWQU5DRURwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRBRFZBTkNFRC9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkQkVHSU5ORVJwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRCRUdJTk5FUi9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3QkSU5URVJNRURJQVRFcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdFtjKCJhY3Rpb24iLCJBRFZBTkNFRHBlciIsIkJFR0lOTkVScGVyIiwiSU5URVJNRURJQVRFcGVyIildICU+JSBndCgpICU+JSAgZGF0YV9jb2xvcihjb2x1bW5zID0gMjo0LCBjb2xvcnMgPSBjb2xfbnVtZXJpYyhwYWxldHRlID0gYygid2hpdGUiLCJkYXJrZ3JlZW4iKSxkb21haW4gPSBjKDAsMTAwKSkpDQpgYGANCg0KYGBge3J9DQptZWRpdW0gPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiTUVESVVNIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KG1lZGl1bVttZWRpdW0kYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9NQVBQSU5HJywnTUFQUEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfTUFQUElORycsJ1NQTElUJywnQkFESU1BR0VSWScpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KG1lZGl1bVttZWRpdW0kYWN0aW9uICVpbiUgYygnTE9DS0VEX0ZPUl9WQUxJREFUSU9OJywnSU5WQUxJREFURUQnLCdWQUxJREFURUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9WQUxJREFUSU9OJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCm1hcHBpbmdMZXZlbCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJNRURJVU0iLF0gJT4lICBncm91cF9ieShtYXBwaW5nTGV2ZWwpICU+JSBzdW1tYXJpc2UoY291bnQgPSBuX2Rpc3RpbmN0KGFjdGlvbkJ5KSkNCm1hcHBpbmdMZXZlbCRwZXJjZW50YWdlIDwtIHJvdW5kKG1hcHBpbmdMZXZlbCRjb3VudC9zdW0obWFwcGluZ0xldmVsJGNvdW50KSoxMDAsMSkNCm1hcHBpbmdMZXZlbA0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9waXZvdCA8LSBkY2FzdChldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJISUdIIixdLCBhY3Rpb24gfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInRhc2tJZCIsIGxlbmd0aCkNCmRhdGFfcGl2b3Qkc3VtIDwtICBkYXRhX3Bpdm90JEFEVkFOQ0VEICsgZGF0YV9waXZvdCRCRUdJTk5FUiArIGRhdGFfcGl2b3QkSU5URVJNRURJQVRFDQpkYXRhX3Bpdm90JEFEVkFOQ0VEcGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkQURWQU5DRUQvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90JEJFR0lOTkVScGVyIDwtIHJvdW5kKGRhdGFfcGl2b3QkQkVHSU5ORVIvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90JElOVEVSTUVESUFURXBlciA8LSByb3VuZChkYXRhX3Bpdm90JElOVEVSTUVESUFURS9kYXRhX3Bpdm90JHN1bSoxMDAsMSkNCmRhdGFfcGl2b3RbYygiYWN0aW9uIiwiQURWQU5DRURwZXIiLCJCRUdJTk5FUnBlciIsIklOVEVSTUVESUFURXBlciIpXSAlPiUgZ3QoKSAlPiUgIGRhdGFfY29sb3IoY29sdW1ucyA9IDI6NCwgY29sb3JzID0gY29sX251bWVyaWMocGFsZXR0ZSA9IGMoIndoaXRlIiwiZGFya2dyZWVuIiksZG9tYWluID0gYygwLDEwMCkpKQ0KYGBgDQoNCmBgYHtyfQ0KaGlnaCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJISUdIIixdDQpkYXRhX3Bpdm90IDwtIGRjYXN0KGhpZ2hbaGlnaCRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX01BUFBJTkcnLCdNQVBQRUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9NQVBQSU5HJywnU1BMSVQnLCdCQURJTUFHRVJZJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QoaGlnaFtoaWdoJGFjdGlvbiAlaW4lIGMoJ0xPQ0tFRF9GT1JfVkFMSURBVElPTicsJ0lOVkFMSURBVEVEJywnVkFMSURBVEVEJywnQVVUT19VTkxPQ0tFRF9GT1JfVkFMSURBVElPTicpLF0sIHByb2plY3RJZCB+IG1hcHBpbmdMZXZlbCx2YWx1ZS52YXIgPSAidXNlcm5hbWUiLCBmdW4uYWdncmVnYXRlID0gdW5pcXVlTikNCnN1bShkYXRhX3Bpdm90JEJFR0lOTkVSKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpgYGANCg0KYGBge3J9DQptYXBwaW5nTGV2ZWwgPC0gZXZlbnRfbG9nX2RmW2V2ZW50X2xvZ19kZiRwcmlvcml0eSA9PSAiSElHSCIsXSAlPiUgIGdyb3VwX2J5KG1hcHBpbmdMZXZlbCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoYWN0aW9uQnkpKQ0KbWFwcGluZ0xldmVsJHBlcmNlbnRhZ2UgPC0gcm91bmQobWFwcGluZ0xldmVsJGNvdW50L3N1bShtYXBwaW5nTGV2ZWwkY291bnQpKjEwMCwxKQ0KbWFwcGluZ0xldmVsDQpgYGANCg0KYGBge3J9DQpkYXRhX3Bpdm90IDwtIGRjYXN0KGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIlVSR0VOVCIsXSwgYWN0aW9uIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ0YXNrSWQiLCBsZW5ndGgpDQpkYXRhX3Bpdm90JHN1bSA8LSAgZGF0YV9waXZvdCRBRFZBTkNFRCArIGRhdGFfcGl2b3QkQkVHSU5ORVIgKyBkYXRhX3Bpdm90JElOVEVSTUVESUFURQ0KZGF0YV9waXZvdCRBRFZBTkNFRHBlciA8LSByb3VuZChkYXRhX3Bpdm90JEFEVkFOQ0VEL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRCRUdJTk5FUnBlciA8LSByb3VuZChkYXRhX3Bpdm90JEJFR0lOTkVSL2RhdGFfcGl2b3Qkc3VtKjEwMCwxKQ0KZGF0YV9waXZvdCRJTlRFUk1FRElBVEVwZXIgPC0gcm91bmQoZGF0YV9waXZvdCRJTlRFUk1FRElBVEUvZGF0YV9waXZvdCRzdW0qMTAwLDEpDQpkYXRhX3Bpdm90W2MoImFjdGlvbiIsIkFEVkFOQ0VEcGVyIiwiQkVHSU5ORVJwZXIiLCJJTlRFUk1FRElBVEVwZXIiKV0gJT4lIGd0KCkgJT4lICBkYXRhX2NvbG9yKGNvbHVtbnMgPSAyOjQsIGNvbG9ycyA9IGNvbF9udW1lcmljKHBhbGV0dGUgPSBjKCJ3aGl0ZSIsImRhcmtncmVlbiIpLGRvbWFpbiA9IGMoMCwxMDApKSkNCmBgYA0KDQpgYGB7cn0NCnVyZ2VudCA8LSBldmVudF9sb2dfZGZbZXZlbnRfbG9nX2RmJHByaW9yaXR5ID09ICJVUkdFTlQiLF0NCmRhdGFfcGl2b3QgPC0gZGNhc3QodXJnZW50W3VyZ2VudCRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX01BUFBJTkcnLCdNQVBQRUQnLCdBVVRPX1VOTE9DS0VEX0ZPUl9NQVBQSU5HJywnU1BMSVQnLCdCQURJTUFHRVJZJyksXSwgcHJvamVjdElkIH4gbWFwcGluZ0xldmVsLHZhbHVlLnZhciA9ICJ1c2VybmFtZSIsIGZ1bi5hZ2dyZWdhdGUgPSB1bmlxdWVOKQ0Kc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCnN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKS8oc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpK3N1bShkYXRhX3Bpdm90JElOVEVSTUVESUFURSkrc3VtKGRhdGFfcGl2b3QkQkVHSU5ORVIpKSoxMDANCmBgYA0KDQpgYGB7cn0NCmRhdGFfcGl2b3QgPC0gZGNhc3QodXJnZW50W3VyZ2VudCRhY3Rpb24gJWluJSBjKCdMT0NLRURfRk9SX1ZBTElEQVRJT04nLCdJTlZBTElEQVRFRCcsJ1ZBTElEQVRFRCcsJ0FVVE9fVU5MT0NLRURfRk9SX1ZBTElEQVRJT04nKSxdLCBwcm9qZWN0SWQgfiBtYXBwaW5nTGV2ZWwsdmFsdWUudmFyID0gInVzZXJuYW1lIiwgZnVuLmFnZ3JlZ2F0ZSA9IHVuaXF1ZU4pDQpzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikvKHN1bShkYXRhX3Bpdm90JEFEVkFOQ0VEKStzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpK3N1bShkYXRhX3Bpdm90JEJFR0lOTkVSKSkqMTAwDQpzdW0oZGF0YV9waXZvdCRJTlRFUk1FRElBVEUpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0Kc3VtKGRhdGFfcGl2b3QkQURWQU5DRUQpLyhzdW0oZGF0YV9waXZvdCRBRFZBTkNFRCkrc3VtKGRhdGFfcGl2b3QkSU5URVJNRURJQVRFKStzdW0oZGF0YV9waXZvdCRCRUdJTk5FUikpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KbWFwcGluZ0xldmVsIDwtIGV2ZW50X2xvZ19kZltldmVudF9sb2dfZGYkcHJpb3JpdHkgPT0gIlVSR0VOVCIsXSAlPiUgIGdyb3VwX2J5KG1hcHBpbmdMZXZlbCkgJT4lIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3QoYWN0aW9uQnkpKQ0KbWFwcGluZ0xldmVsJHBlcmNlbnRhZ2UgPC0gcm91bmQobWFwcGluZ0xldmVsJGNvdW50L3N1bShtYXBwaW5nTGV2ZWwkY291bnQpKjEwMCwxKQ0KbWFwcGluZ0xldmVsDQpgYGANCg==